package br.com.afi.pattern.business;

import java.io.Serializable;
import java.util.List;

import br.com.afi.pattern.model.Model;

/**
 * Essa interface possui as assinaturas dos métodos necessários para implementar as quatro operações
 * básicas. Implemente esta interface nas classes que contém a regra de negócio.
 * 
 * @author André de Fontana Ignacio
 * @version 1.0
 * @param <E> Tipo do Model (Entity)
 * @param <ID> Tipo do Id do Model (Entity)
 */
public interface Business<E extends Model<ID>, ID extends Serializable>
{
	/**
	 * Busca através do Id.
	 * 
	 * @param id Id
	 * @return Model (Entity)
	 */
	public E findById( ID id );

	/**
	 * Verifica se existe um registro com o Id informado.
	 * 
	 * @param id Id
	 * @return Verdadeiro se existir
	 */
	public boolean existsById( ID id );

	/**
	 * Salva o {@link Model} informado.
	 * 
	 * @param e Model (Entity)
	 * @return Model (Entity)
	 * @throws BusinessException Lançada quando ocorrer alguma exceção na regra de negócio
	 */
	public E save( E e ) throws BusinessException;

	/**
	 * Apaga o {@link Model} informado.
	 * 
	 * @param e Model (Entity)
	 * @throws BusinessException Lançada quando ocorrer alguma exceção na regra de negócio
	 */
	public void delete( E e ) throws BusinessException;

	/**
	 * Busca todos os registros.
	 * 
	 * @return Lista de {@link Model}
	 */
	public List<E> findAll();

}
